﻿using System;
using System.Data.Common;
using EPiServer.Common.Data;
using EPiServer.Core;
using EPiServer.Templates.RelatePlus.Templates.PageEntity;
using EPiServer.Web;

namespace EPiServer.Templates.RelatePlus.Templates.PageEntity
{
    public class PageEntityFactory : FrameworkFactoryBase
    {
        public static PageEntity GetPageEntity(PageReference pageref)
        {
            return GetPageEntity(PermanentLinkUtility.FindGuid(pageref));
        }

        public static PageEntity GetPageEntity(int ID)
        {
            PageEntity tpr = null;
            using (DbDataReader reader = DatabaseHandler.GetReader("spGetPageEntityByID", ID))
            {
                if (reader.Read())
                    tpr = ConstructPageEntity(reader);
            }
            return tpr;
        }

        public static PageEntity GetPageEntity(Guid guid)
        {
            PageEntity tpr = null;
            using (DbDataReader reader = DatabaseHandler.GetReader("spGetPageEntityByPageGUID", guid))
            {
                if (reader.Read())
                    tpr = ConstructPageEntity(reader);
            }
            return tpr;
        }

        internal static PageEntityCollection GetPageEntities()
        {
            PageEntityCollection tprs = new PageEntityCollection();
            using (DbDataReader reader = DatabaseHandler.GetReader("spGetPageEntities"))
            {
                while (reader.Read())
                {
                    tprs.Add(ConstructPageEntity(reader));
                }
            }
            return tprs;
        }

        internal static PageEntityCollection GetPageEntitiesByType(PageEntityTypes entityType)
        {
            PageEntityCollection tprs = new PageEntityCollection();
            using (DbDataReader reader = DatabaseHandler.GetReader("spGetPageEntities", (int)entityType))
            {
                while (reader.Read())
                    tprs.Add(ConstructPageEntity(reader));
            }
            return tprs;
        }

        internal static PageEntity AddPageEntity(PageEntity tpr)
        {
            int newId = -1;
            DatabaseHandler.RunInTransaction(delegate
                                                 {
                                                     newId = Convert.ToInt32(DatabaseHandler.GetScalar("spAddPageEntity", tpr.PageGUID, (int)tpr.EntityType, tpr.SiteID));

                                                     UpdateEntity(tpr, newId);
                                                 });
            return PageEntityHandler.GetPageEntity(newId);
        }

        internal static void UpdatePageEntity(PageEntity tpr)
        {
            DatabaseHandler.RunInTransaction(delegate
                                                 {
                                                     DatabaseHandler.GetScalar("spUpdatePageEntity",
                                                                               tpr.ID, (int) tpr.EntityType, tpr.SiteID);

                                                     UpdateEntity(tpr);
                                                 });
        }

        internal static void RemovePageEntity(PageEntity pageEntity)
        {
            DatabaseHandler.RunInTransaction(delegate
                                                 {
                                                     DatabaseHandler.ExecuteNonQuery("spRemovePageEntity", pageEntity.ID);

                                                     RemoveEntity(pageEntity);
                                                 });
        }

        public static PageEntity ConstructPageEntity(DbDataReader reader)
        {
            //CommunityLogic.Instance.GetPageEntityType(CurrentPage))
            PageEntityTypes pageEntityTypes = (PageEntityTypes)reader.GetInt32(2);

            Type entityType = PageEntityUtils.GetPageEntityType(pageEntityTypes);
            
            // try do a automapping helper method
            return (PageEntity)EntityProviderHandler.
                                   GetEntityProvider(typeof(PageEntity)).GetEntityInstance(entityType, reader);
        }
    }
}